/**
 * 浏览器工具
 * @see BrowserUtil.ts 
 * @version 20210508
 */
export default class BrowserUtil {

    /**
     * 清除当前 URL 的参数（修改历史记录，不会刷新当前网页）
     */
    public static clearUrlParam(): void {
        if (!window || !window.history) {
            return;
        }
        window.history.replaceState({}, null, '.');
    }

    /**
     * 设置当前 URL 的参数（修改历史记录，不会刷新当前网页）
     * @param param 参数
     */
    public static setUrlParam(param: string): void {
        if (!window || !window.history) {
            return;
        }
        window.history.replaceState({}, null, `?${param}`);
    }

    /**
     * 获取当前 URL 的参数
     * @param key 键
     */
    public static getUrlParam(key: string): string {
        if (!window || !window.location) {
            return null;
        }
        const query = window.location.search.replace('?', '');
        if (query === '') {
            return null;
        }
        const substrings = query.split('&');
        for (let i = 0; i < substrings.length; i++) {
            const keyValue = substrings[i].split('=');
            if (decodeURIComponent(keyValue[0]) === key) {
                return decodeURIComponent(keyValue[1]);
            }
        }
        return null;
    }

    /**
     * 复制文本至设备剪贴板
     * @param value 文本内容
     */
    public static copy(value: string): boolean {
        if (!document) {
            return false;
        }
        // 创建输入元素
        const element = document.createElement('textarea');
        element.readOnly = true;
        element.style.opacity = '0';
        element.value = value;
        document.body.appendChild(element);
        // 选择元素
        element.select();
        // 兼容低版本 iOS 的特殊处理
        const range = document.createRange();
        range.selectNodeContents(element);
        const selection = getSelection();
        selection.removeAllRanges();
        selection.addRange(range);
        // 复制
        const result = document.execCommand('copy');
        element.remove();
        return result;
    }

    /**
     * 打开文件选择器
     * @param {string} accept
     * @param {(file: File) => void} callback
     * @memberof FileMgr
     */
    public static openLocalFile(accept: string, callback: (file: any) => void) {
        if (!document) {
            return;
        }
        let inputEl: HTMLInputElement = <HTMLInputElement>document.getElementById('file_input');
        if (!inputEl) {
            // console.log('xxxxxx createElement input');
            inputEl = document.createElement('input');
            inputEl.id = 'file_input';
            inputEl.setAttribute('id', 'file_input');
            inputEl.setAttribute('type', 'file');
            inputEl.setAttribute('class', 'fileToUpload');
            inputEl.style.opacity = '0';
            inputEl.style.position = 'absolute';
            inputEl.setAttribute('left', '-999px');
            document.body.appendChild(inputEl);
        }

        accept = accept || ".*";
        inputEl.setAttribute('accept', accept);

        inputEl.onchange = (event) => {
            let files = inputEl.files;
            if (files && files.length > 0) {
                var file = files[0];
                var fr = new FileReader();
                fr.readAsDataURL(file);
                fr.onload = (e)=>{
                    if (callback) callback(e.target.result);
                }
                // if (callback) callback(file);
            }
        }
        inputEl.click();
    }
}
